package com.cskaoyan.yesterday;

import java.io.File;
import java.io.FileFilter;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

/**
 * @author zhangshuai@Cskaoyan.onaliyun.com.
 * @version 1.0
 */
public class Work3 {

    public static void main(String[] args) {
        FileHandler fileHandler = null;
        try {
            //要查找的目录
            File dir = new File("d:\\firstLevel");
            //利用fileHandler对象，完成递归查找，并将查找结果，存到d:\paths.txt文件中
            fileHandler = new FileHandler("d:\\paths.txt");

            //由MyFileFilter对象，指明目标文件的筛选条件，开始递归查找，
            // 并对找到的目标文件做相应处理
            fileHandler.findFile(dir, new MyFileFilter());
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // 这里大家可以把try-catch替换成那个closeQuietly方法
            try {
                fileHandler.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
class MyFileFilter implements FileFilter {

    @Override
    public boolean accept(File pathname) {
        return pathname != null
                && pathname.isFile()
                && pathname.getName().endsWith(".java");
    }
}

/*
      利用该类，完成文件的递归查找功能
 */
class FileHandler {
    //保存指定目录中，所有java文件的绝对路径，的那个文本文件
    File record;
    //用来将java文件的绝对路径，写入文本文件的输出流
    private OutputStream os;
    public FileHandler(String recordPath) throws FileNotFoundException {
        //利用目标文件的路径字符串，初始化，表示用来存储文件名的文件的File对象
        record = new File(recordPath);
        //初始化输出流对象
        os = new FileOutputStream(record);
    }

    /*
          利用该方法，使用由FileFilter对象，所指明的筛选条件，筛选出符合条件的文件
          并将这些文件的绝对路径，保存到指定文件中
     */
    public void findFile(File file, FileFilter filter) throws IOException {
        File[] files = file.listFiles();

        if (files == null) {
            //说明当前File dir其实表示的是一个文件

            if (filter.accept(file)) {
                //满足筛选条件，则将其绝对路径，保存到目标文件中
                os.write(file.getAbsolutePath().getBytes());
                os.write('\n');
            }
            return;
        }
        for (int i = 0; i < files.length; i++) {
            findFile(files[i], filter);
        }
    }

    /*
         利用该方法关闭输出流 os
     */
    public void close() throws IOException {
        os.close();
    }
}

